#ifndef _LOG_H_
#define _LOG_H_

#include <stdio.h>
#include "main.h"

/**
 * @brief 封装 UART 相关信息的结构体。
 *
 * 这个结构体用于存储 UART 的各种配置信息，包括 UART 句柄、USART 端口指针、中断号、GPIO 端口指针以及发送和接收引脚编号。
 */
typedef struct {
  UART_HandleTypeDef handle; 	/* < UART 句柄。				*/
  USART_TypeDef *usart; 			/* < USART 端口指针。	*/
  IRQn_Type irqn; 						/* < 中断号。					*/
  GPIO_TypeDef *gpio; 				/* < GPIO 端口指针。		*/
  uint16_t txPin; 						/* < 发送引脚编号。 		*/
  uint16_t rxPin; 						/* < 接收引脚编号。 		*/
} LogUartConfig;

/**
 *  @def LOG_USART_NUM
 *  @brief 日志串口选择宏。
 *	1->USART1
 *  2->USART2
 *  3->USART3
 */
#define LOG_USART_CHOICE_NUM 1

/**
 * @def __LOG_SEC__
 * @brief 当前日志时间宏。
 *
 * 默认使用 `HAL_GetTick()` 获取当前时间。
 */
#ifndef __LOG_SEC__
	#define __LOG_SEC__ HAL_GetTick()
#endif

/**
 * @def Log_Enable_Color
 * @brief 打印日志附带颜色宏。
 *
 * 0->无颜色
 * 1->有颜色
 */
#ifndef Log_Enable_Color
	#define Log_Enable_Color 0
	#define Arrow 			"->"
#endif

#if Log_Enable_Color == 1
	#define COLOR_RESET   "\033[0m"				/* 黑色字体 */
	#define COLOR_BLUE    "\033[34m"			/* 蓝色字体 */
	#define COLOR_GREEN   "\033[32m"			/* 绿色字体 */
	#define COLOR_YELLOW  "\033[33m"			/* 黄色字体 */
	#define COLOR_RED     "\033[31m"			/* 红色字体 */
	/* 调试提示 */
	#define logd(fmt, ...) printf(COLOR_BLUE   "|DEBUG| %08d | <%s>:%d |"COLOR_RESET Arrow fmt "\r\n" \
																, __LOG_SEC__, __FUNCTION__, __LINE__, ##__VA_ARGS__)
	/* 信息提示 */
	#define logi(fmt, ...) printf(COLOR_GREEN  "|INFO | %08d | <%s>:%d |"COLOR_RESET Arrow fmt "\r\n" \
																, __LOG_SEC__, __FUNCTION__, __LINE__, ##__VA_ARGS__)
	/* 系统警告 */
	#define logw(fmt, ...) printf(COLOR_YELLOW "|WRAN | %08d | <%s>:%d |"COLOR_RESET Arrow fmt "\r\n" \
																, __LOG_SEC__, __FUNCTION__, __LINE__, ##__VA_ARGS__)
	/* 系统错误 */
	#define loge(fmt, ...) printf(COLOR_RED    "|ERROR| %08d | <%s>:%d |"COLOR_RESET Arrow fmt "\r\n" \
																, __LOG_SEC__, __FUNCTION__, __LINE__, ##__VA_ARGS__)
#else
	/* 调试提示 */
	#define logd(fmt, ...) printf("|DEBUG| %08d | <%s>:%d |" Arrow fmt "\r\n", \
																__LOG_SEC__, __FUNCTION__, __LINE__, ##__VA_ARGS__)
	/* 信息提示 */
	#define logi(fmt, ...) printf("|INFO | %08d | <%s>:%d |" Arrow fmt "\r\n", \
																__LOG_SEC__, __FUNCTION__, __LINE__, ##__VA_ARGS__)
	/* 系统警告 */
	#define logw(fmt, ...) printf("|WRAN | %08d | <%s>:%d |" Arrow fmt "\r\n", \
																__LOG_SEC__, __FUNCTION__, __LINE__, ##__VA_ARGS__)
	/* 系统错误 */
	#define loge(fmt, ...) printf("|ERROR| %08d | <%s>:%d |" Arrow fmt "\r\n", \
																__LOG_SEC__, __FUNCTION__, __LINE__, ##__VA_ARGS__)
#endif

int Log_USART_Init(int My_BaudRate);
void Log_setCurrentUart(int num);
#endif //!_LOG_H_
